Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - [Assembly AT&T] Delucidazioni su alcuni dubbi
Forum - Altri Linguaggi - [Assembly AT&T] Delucidazioni su alcuni dubbi

Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 20:40
Venerdì, 11/03/2011
Salve, ho da poco iniziato l'apprendimento dell' assembly con sintassi AT&T. Voglio provare a crea un programma, che faccia quanto segue: Data una stringa in input, stampare il suo contrario. In C io farei una cosa del genere:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main (void) {
  5.         char stringa[20];
  6.         int i;
  7.         printf("Inserisci stringa: ");
  8.         fgets(stringa, sizeof(stringa), stdin);
  9.         stringa[strlen(stringa)-1] = '\0';
  10.         printf("Stringa al contrario: ");
  11.         for (i = strlen(stringa); i >= 0; i--) {
  12.                 printf("%c", stringa[i]);
  13.         }
  14.         printf("\n");
  15.         return 0;
  16. }


In assembly non riesco a capire come piazzare in un registro ad esempio l'ultimo carattere della stringa, il penultimo carattere della stringa, il terzultimo carattere della stringa, ecc. Io avevo pensato ad una cosa simile:
Codice sorgente - presumibilmente Plain Text

  1. movb stringa[n], %ecx


ovvero spostare un byte a partire da stringa[n], nel registro ECX ma non funge... Soluzioni?

Ultima domanda che  differenza c'è nello scrivere:
Codice sorgente - presumibilmente Altri Linguaggi

  1. decl var


e
Codice sorgente - presumibilmente Plain Text

  1. movl $var, %eax
  2. decl %eax


Ultima modifica effettuata da Pitagora il 11/03/2011 alle 20:44
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 21:44
Sabato, 12/03/2011
Rispondo all'ultima domanda: dec vuole un registro come argomento
riguardo a string[n], pensalo come *(string + n*sizeof(char)). In pratica ti basta mettere string in un registro, o meglio, l'indirizzo al primo elemento della stringa. Dopo in un altro registro metti 0. Dopodichè usi il meccanismo che ho scritto sopra per ottenere il valore a quell'indirizzo di memoria, e per scorrere la stringa basta che incrementi questo registro. Probabilmente ci sono modi migliori ma l'assembly non l'ho mai approfondito.

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 12:02
Domenica, 13/03/2011
in modo più semplice:
Codice sorgente - presumibilmente Plain Text

  1. movl $str, %ecx
  2. addl $3, %ecx


è uguale a scrivere
Codice sorgente - presumibilmente Plain Text

  1. *(stringa += 3)


Puntano entrambe all'elemento 3* della stringa.

Grazie lo stesso. :k:

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 19:33
Mercoledì, 16/03/2011
Per chi avrà problemi in futuro, inserisco qui il codice:

Codice sorgente - presumibilmente Altri Linguaggi

  1. .data
  2.       welcome: .string "Inserisci stringa "
  3.       n_welcome = .-welcome
  4.       sms: .string "Stringa ribaltata "
  5.       n_sms = .-sms
  6.       str: .space 30 # Lunghezza stringa
  7.       n_str = .-str
  8.       new_line: .string "\n"
  9. .text
  10.       .global main
  11. main:
  12.       # STAMPO: "Inserisci stringa "
  13.       movl $4, %eax
  14.       movl $1, %ebx
  15.       movl $welcome, %ecx
  16.       movl $n_welcome, %edx
  17.       int $0x080
  18.      
  19.       # LEGGO: str
  20.       movl $3, %eax
  21.       movl $0, %ebx
  22.       movl $str, %ecx
  23.       movl $n_str, %edx
  24.       int $0x080
  25.      
  26.       # STAMPO: "Stringa ribaltata "
  27.       movl $4, %eax
  28.       movl $1, %ebx
  29.       movl $sms, %ecx
  30.       movl $n_sms, %edx
  31.       int $0x080
  32.      
  33.       # COPIO: lunghezza str nel registro ESI
  34.       movl $n_str, %esi
  35.  
  36.  loop:
  37.       movl $4, %eax
  38.       movl $1, %ebx
  39.       movl $str, %ecx
  40.       addl %esi, %ecx
  41.       movl $1, %edx
  42.       int $0x080
  43.      
  44.       decl %esi
  45.      
  46.       cmp $-1, %esi
  47.       jne loop
  48.  
  49.  exit:
  50.       movl $4, %eax
  51.       movl $1, %ebx
  52.       movl $new_line, %ecx
  53.       movl $1, %edx
  54.       int $0x080
  55.      
  56.       movl $1, %eax
  57.       movl $0, %ebx
  58.       int $0x080

:rofl:

PM Quote